Para a elaboração de gráficos, utilizaremos as funções do pacote ggplot2. Em regra, essas funções são de fácil assimilação após pouco tempo de treino.

De modo geral, a elaboração de um gráfico com o pacote ggplot2 não costuma ser uma tarefa difícil, desde que o aluno tenha em mente três coisas:

Obviamente, a depender das razões do discente, pode haver gráficos que dependerão de um nível alto de erudição no R. Porém, para a maior das necessidades desse curso, o aluno encontrará soluções interessantes nos códigos abaixo.

Dito isso, vamos comandar os pacotes necessários para essa aula:

library(tidyverse)
library(plotly)
library(ggrepel)
library(PerformanceAnalytics)
library(reshape2)

Gráfico de Barras

Vamos carregar nossa base de dados que será utilizada para a construção de um gráfico de barras.

load("perfil_investidor.RData")

Aplicando a sintaxe básica do ggplot2 à base de dados:

Note que a nomenclatura dos perfis foi ordenada de forma alfabética. Para alterar a situação, podemos utilizar a função factor(), para redefinir a ordem dos levels:

perfil_investidor$perfil <- factor(perfil_investidor$perfil,
                                   levels = c("Conservador", 
                                              "Moderado", 
                                              "Agressivo"))

Utilizando, mais uma vez, a sintaxe básica do ggplot2 à base de dados:

ggplot(data = perfil_investidor) +
  geom_bar(aes(x = perfil))

Adicionando informações ao nosso gráfico:

ggplot(data = perfil_investidor) +
  geom_bar(aes(x = perfil)) +
  labs(title = "Perfil dos Investidores do Banco X",
       x = "Perfil do Investidor",
       y = "Quantidade")

Adicionando detalhamentos ao gráfico:

ggplot(data = perfil_investidor) +
  geom_bar(aes(x = perfil)) +
  labs(title = "Perfil dos Investidores",
       subtitle = "Banco X",
       x = "Perfil do Investidor",
       y = "Quantidade",
       caption = "Período: 2021")

Adicionando cores à plotagem:

ggplot(data = perfil_investidor) +
  geom_bar(aes(x = perfil), fill = "darkorchid") +
  labs(title = "Perfil dos Investidores",
       subtitle = "Banco X",
       x = "Perfil do Investidor",
       y = "Quantidade",
       caption = "Período: 2021")

Para verificar as cores possíveis de serem declaradas com a linguagem básica do R, podemos acessar o seguinte sítio eletrônico:

Espécie de catálogo de cores para gráficos no R

Alterando as cores:

ggplot(data = perfil_investidor) +
  geom_bar(aes(x = perfil), fill = "orange") +
  labs(title = "Perfil dos Investidores",
       subtitle = "Banco X",
       x = "Perfil do Investidor",
       y = "Quantidade",
       caption = "Período: 2021")

Adicionando bordas:

ggplot(data = perfil_investidor) +
  geom_bar(aes(x = perfil), color = "darkorchid", fill = "orange") +
  labs(title = "Perfil dos Investidores",
       subtitle = "Banco X",
       x = "Perfil do Investidor",
       y = "Quantidade",
       caption = "Período: 2021")

Modificando o fundo dos gráficos:

ggplot(data = perfil_investidor) +
  geom_bar(aes(x = perfil), color = "darkorchid", fill = "orange") +
  labs(title = "Perfil dos Investidores",
       subtitle = "Banco X",
       x = "Perfil do Investidor",
       y = "Quantidade",
       caption = "Período: 2021") +
  theme_linedraw()

Adicionando labels:

ggplot(data = perfil_investidor) +
  geom_bar(aes(x = perfil), color = "darkorchid", fill = "orange") +
  geom_label(aes(x = perfil, label = ..count..), stat = "count") +
  labs(title = "Perfil dos Investidores",
       subtitle = "Banco X",
       x = "Perfil do Investidor",
       y = "Quantidade",
       caption = "Período: 2021") +
  theme_light()

Reposicionando as labels:

ggplot(data = perfil_investidor) +
  geom_bar(aes(x = perfil), color = "darkorchid", fill = "orange") +
  geom_text(aes(x = perfil, label = ..count..), 
            stat = "count", vjust = 2) +
  labs(title = "Perfil dos Investidores",
       subtitle = "Banco X",
       x = "Perfil do Investidor",
       y = "Quantidade",
       caption = "Período: 2021") +
  theme_light()

Rotacionando um gráfico:

ggplot(data = perfil_investidor) +
  geom_bar(aes(x = perfil), color = "darkorchid", fill = "orange") +
  geom_text(aes(x = perfil, label = ..count..), stat = "count", hjust = -0.5) +
  labs(title = "Perfil dos Investidores",
       subtitle = "Banco X",
       x = "Perfil do Investidor",
       y = "Quantidade",
       caption = "Período: 2021") +
  coord_flip() +
  theme_light()

Invertendo as ordens das categorias:

ggplot(data = perfil_investidor) +
  geom_bar(aes(x = fct_rev(perfil)), color = "darkorchid", fill = "orange") +
  geom_text(aes(x = perfil, label = ..count..), 
            stat = "count", hjust = -1) +
  labs(title = "Perfil dos Investidores",
       subtitle = "Banco X",
       x = "Perfil do Investidor",
       y = "Quantidade",
       caption = "Período: 2021") +
  coord_flip() +
  theme_light()

Histograma

Vamos utilizar alguns dados sobre os municípios de São Paulo para essa nova demanda:

load("dados_sp.RData")

Aplicando a sintaxe básica do ggplot2:

ggplot(data = dados_sp) +
  geom_histogram(aes(x = idh))
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

Colorindo o gráfico:

ggplot(data = dados_sp) +
  geom_histogram(aes(x = idh), fill = "darkorchid")
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

Alterando o plano de fundo:

ggplot(data = dados_sp) +
  geom_histogram(aes(x = idh), fill = "darkorchid") +
  theme_minimal()
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

Adicionando contornos e nomes dos eixos:

ggplot(data = dados_sp) +
  geom_histogram(aes(x = idh), fill = "darkorchid", color = "black") +
  labs(x = "IDH dos Municípios de SP",
       y = "Frequência") +
  theme_minimal()
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

Alterando a quantidade de caixas do histograma:

ggplot(data = dados_sp) +
  geom_histogram(aes(x = pib), fill = "darkorchid",
                 color = "black", bins = 100) +
  labs(x = "PIB dos Municípios de SP",
       y = "Frequência") +
  theme_minimal()

Gráfico de Pontos

Para esse desafio, utilizaremos dados sobre os bairros da capital de São Paulo:

load("atlas_ambiental.RData")

Aplicando a sintaxe básica do ggplot2:

ggplot(atlas_ambiental) +
  geom_point(aes(x = renda, y = escolaridade))

Estratificando informações - o uso do argumento size:

ggplot(atlas_ambiental) +
  geom_point(aes(x = renda, y = escolaridade, size = idade))

Estratificando informações - o uso do argumento color:

ggplot(atlas_ambiental) +
  geom_point(aes(x = renda, y = escolaridade, 
                 size = idade, color = favel < 6))

Estratificando informações - o uso do argumento shape:

ggplot(atlas_ambiental) +
  geom_point(aes(x = renda, y = escolaridade, 
                 size = idade, color = favel < 6, 
                 shape = mortalidade > 18)) +
  labs(title = "Indicadores dos Distritos do Município de São Paulo",
       x = "Renda",
       y = "Escolaridade") +
  theme_bw()

Traçando uma linha de tendências:

ggplot(atlas_ambiental) +
  geom_point(aes(x = renda, y = escolaridade, 
                 size = idade, color = favel < 6, 
                 shape = mortalidade > 18)) +
  geom_smooth(aes(x = renda, y = escolaridade), 
              method = "loess", se = FALSE) +
  labs(title = "Indicadores dos Distritos do Município de São Paulo",
       x = "Renda",
       y = "Escolaridade") +
  theme_bw()
## `geom_smooth()` using formula 'y ~ x'

Aproveitando o assunto “tendências”, vamos seguir explorando as capacidades do R com uma nova base de dados sobre a corrupção no mundo (Fisman & Miguel, 2007):

load("fisman_miguel.RData")

Notem que seria interessante plotar, por exemplo, o número de violações de trânsito em função do índice de corrupção do país. Vamos tentar?

ggplot(fisman_miguel) +
  geom_point(aes(x = corruption, y = violations)) +
  geom_smooth(aes(x = corruption, y = violations), 
              se = FALSE, 
              method = "loess") +
  geom_text(aes(x = corruption, y = violations, label = code))
## `geom_smooth()` using formula 'y ~ x'

Note que há dois problemas principais: 1) Há muitos países sem violações reportadas, ou com um baixo número de violações, e países com um número alto de violações reportadas, o que deixaria o gráfico com problemas de escala; 2) Haveria uma dupla contagem, porque os países foram verificados antes e depois da imposição da nova lei de NY.

Vamos tentar mitigar o primeiro problema, padronizando os valores da variável violations

ggplot(fisman_miguel) +
  geom_point(aes(x = corruption, y = log(violations))) +
  geom_smooth(aes(x = corruption, y = log(violations)), 
              se = F, 
              method = "loess") +
  geom_text(aes(x = corruption, y = log(violations), label = code))
## `geom_smooth()` using formula 'y ~ x'
## Warning: Removed 65 rows containing non-finite values (stat_smooth).

Agora, podemos tentar mitigar o segundo problema com alguma função de facet:

ggplot(fisman_miguel) +
  geom_point(aes(x = corruption, y = log(violations))) +
  geom_smooth(aes(x = corruption, y = log(violations)), 
              se = F, 
              method = "loess") +
  geom_text(aes(x = corruption, y = log(violations), label = code)) +
  facet_wrap(~post) +
  theme_bw()
## `geom_smooth()` using formula 'y ~ x'
## Warning: Removed 65 rows containing non-finite values (stat_smooth).

Note um terceiro problema não identificado anteriormente: a sobreposição de labels. Podemos tentar resolver a situação com a função geom_text_repel(), do pacote ggrepel:

ggplot(fisman_miguel) +
  geom_point(aes(x = corruption, y = log(violations))) +
  geom_smooth(aes(x = corruption, y = log(violations)), 
              se = F, method = "loess") +
  geom_text_repel(aes(x = corruption, y = log(violations), label = code)) +
  facet_wrap(~post) +
  theme_bw()
## `geom_smooth()` using formula 'y ~ x'
## Warning: Removed 65 rows containing non-finite values (stat_smooth).
## Warning: ggrepel: 93 unlabeled data points (too many overlaps). Consider
## increasing max.overlaps
## Warning: ggrepel: 124 unlabeled data points (too many overlaps). Consider
## increasing max.overlaps

Gráfico de Linhas

Para os nossos gráficos de linhas, vamos utilizar dados da atual pandemia no Brasil, Índia, Rússia e Estados Unidos da América:

load("covid_110521.RData")

Aplicando a sintaxe básica do ggplot2:

ggplot(covid_110521) +
  geom_line(aes(x = t, y = cumulative_cases))

Note que não informamos para o ggplot2 que cada linha deveria representar um país. Assim:

ggplot(covid_110521) +
  geom_line(aes(x = t, y = cumulative_cases, color = country))

Adicionando informações e deixando o gráfico mais elegante:

ggplot(covid_110521) +
  geom_line(aes(x = t, y = cumulative_cases, color = country)) +
  geom_point(aes(x = t, y = cumulative_cases, color = country)) +
  labs(x = "Tempo em dias desde o primeiro caso oficial do Sars-Cov-2 reportado",
       y = "Casos Cumulativos",
       color = "País") +
  theme_bw()

O gráfico anterior poderia ser mais informativo, visto que, por exemplo, compara países com tamanhos populacionais distintos. Portanto, a magnitude das infecções também é distinta. Uma possibilidade de suavização da situação poderia ser a padronização da variável ‘cumulative_cases’. No gráfico a seguir, padronizamos os casos cumulativos de cada país numa escala log10:

covid_110521["log_ccases"] <- log10(covid_110521$cumulative_cases)

O gráfico resultante é o seguinte:

ggplot(covid_110521) +
  geom_line(aes(x = t, y = log_ccases, color = country)) +
  geom_point(aes(x = t, y = log_ccases, color = country)) +
  labs(x = "Tempo em dias desde o primeiro caso oficial do Sars-Cov-2 reportado",
       y = "Log10 Casos Cumulativos",
       color = "País") +
  theme_bw()

Por mais que dê para se extrair alguns insights interessantes do gráfico anterior, alguém poderia dizer que seria melhor, por exemplo, utilizar uma proporção da população infectada em razão do tempo passado:

covid_110521["pop_ccases"] <- covid_110521$cumulative_cases / 
  covid_110521$pop

O resultado visual vem abaixo:

ggplot(covid_110521) +
  geom_line(aes(x = t, y = pop_ccases, color = country)) +
  geom_point(aes(x = t, y = pop_ccases, color = country)) +
  labs(x = "Tempo em dias desde o primeiro caso oficial do Sars-Cov-2 reportado",
       y = "Casos Cumulativos",
       color = "País") +
  theme_bw()

Ainda assim, os gráficos não trazem uma informação importante: os valores dos casos cumulativos por dia e por país. Em regra, no ggplot, podemos utilizar a geometria ‘text’ para isso:

ggplot(covid_110521) +
  geom_line(aes(x = t, y = cumulative_cases, color = country)) +
  geom_point(aes(x = t, y = cumulative_cases, color = country)) +
  geom_text(aes(x = t, y = cumulative_cases, label = cumulative_cases), 
            color = "black", size = 2) +
  labs(x = "Tempo em dias desde o primeiro caso oficial do Sars-Cov-2 reportado",
       y = "Casos Cumulativos",
       color = "País") +
  theme_bw()

E se deslocássemos as labels dos valores dos casos cumulativos?

ggplot(covid_110521) +
  geom_line(aes(x = t, y = cumulative_cases, color = country)) +
  geom_point(aes(x = t, y = cumulative_cases, color = country)) +
  geom_text(aes(x = t, y = cumulative_cases, label = cumulative_cases), 
            color = "black", size = 2, vjust = -1) +
  labs(x = "Tempo em dias desde o primeiro caso oficial do Sars-Cov-2 reportado",
       y = "Casos Cumulativos",
       color = "País") +
  theme_bw()

Ainda está caótico, certo? E se alterássemos o ângulo de exibição das labels?

ggplot(covid_110521) +
  geom_line(aes(x = t, y = cumulative_cases, color = country)) +
  geom_point(aes(x = t, y = cumulative_cases, color = country)) +
  geom_text(aes(x = t, y = cumulative_cases, label = cumulative_cases), 
            color = "black", size = 2, vjust = -1, angle = 45) +
  labs(x = "Tempo em dias desde o primeiro caso oficial do Sars-Cov-2 reportado",
       y = "Casos Cumulativos",
       color = "País") +
  theme_bw()

Continua péssimo. São muitos dias e muitos países analisados ao mesmo tempo!

A função geom_text_repel() do pacote ‘ggrepel’, por vezes resolve o problema:

ggplot(covid_110521) +
  geom_line(aes(x = t, y = cumulative_cases, color = country)) +
  geom_point(aes(x = t, y = cumulative_cases, color = country)) +
  geom_text_repel(aes(x = t, y = cumulative_cases, label = cumulative_cases), 
                  color = "black", size = 2) +
  labs(x = "Tempo em dias desde o primeiro caso oficial do Sars-Cov-2 reportado",
       y = "Casos Cumulativos",
       color = "País") +
  theme_bw()
## Warning: ggrepel: 1244 unlabeled data points (too many overlaps). Consider
## increasing max.overlaps

Dá até vontade de desistir, a gente sabe! Em casos extremos, como no exemplo apresentado, talvez seja melhor omitir as labels e deixar o gráfico interativo com o usuário da informação. Podemos fazer isso com a função ggplotly() do pacote ‘plotly’:

ggplotly(
  ggplot(covid_110521) +
    geom_line(aes(x = t, y = cumulative_cases, color = country)) +
    geom_point(aes(x = t, y = cumulative_cases, color = country)) +
    labs(x = "Tempo em dias desde o primeiro caso oficial do Sars-Cov-2 reportado",
         y = "Casos Cumulativos",
         color = "País") +
    theme_bw()
)

Agora passa passar o mouse pelo gráfico para ter acesso às informações necessárias!

Caso quiséssemos fazer uma análise diária, bastaria mudar a variável de interesse:

ggplotly(
  ggplot(covid_110521) +
    geom_line(aes(x = t, y = daily_cases, color = country)) +
    geom_point(aes(x = t, y = daily_cases, color = country)) +
    labs(x = "Tempo em dias desde o primeiro caso oficial do Sars-Cov-2 reportado",
         y = "Casos Diários",
         color = "País") +
    theme_bw()
)

Mapas de Calor

Nosso principal exemplo para gráficos de calor para hoje será a respeito da relação entre variáveis. Entre variáveis métricas, essas relações se chamam correlações, cuja fórmula do coeficiente de correlação de Pearson segue a seguir:

\(\rho = \frac{\sum_{i=1}^{n}(X_{i}-\bar{X}).(Y_{i}-\bar{Y})}{\sqrt{\sum_{i=1}^{n}(X_{i}-\bar{X})^2.\sqrt{\sum_{i=1}^{n}(Y_{i}-\bar{Y})^2}}}\)

Assim, primeiro vamos observar alguns gráficos correlacionais com a função chart.Correlation() do pacote ’PerformanceAnalytics”:

chart.Correlation(atlas_ambiental[, 3:11], histogram = T)

Para criarmos um gráfico de calor a respeito das correlações da nossa base de dados, o primeiro passo é estabelecer uma Matriz de Correlações. Podemos fazer isso utilizando a função cor() da linguagem básica do R:

matriz_correlacoes <- cor(atlas_ambiental[, 3:11])

matriz_correlacoes
##                    renda       quota escolaridade      idade mortalidade
## renda         1.00000000  0.92009937    0.7773322  0.7323071 -0.51958497
## quota         0.92009937  1.00000000    0.8504546  0.8327369 -0.52028200
## escolaridade  0.77733216  0.85045460    1.0000000  0.9558249 -0.58260085
## idade         0.73230705  0.83273686    0.9558249  1.0000000 -0.55375832
## mortalidade  -0.51958497 -0.52028200   -0.5826008 -0.5537583  1.00000000
## txcresc      -0.42471079 -0.55476724   -0.6929676 -0.7032367  0.34604928
## causasext    -0.46251567 -0.49101971   -0.6066208 -0.6150734  0.42278951
## favel        -0.14695749 -0.24301018   -0.4325480 -0.4998385  0.13087742
## denspop      -0.01971076  0.05737442    0.1576728  0.1414692 -0.09301763
##                 txcresc   causasext      favel     denspop
## renda        -0.4247108 -0.46251567 -0.1469575 -0.01971076
## quota        -0.5547672 -0.49101971 -0.2430102  0.05737442
## escolaridade -0.6929676 -0.60662084 -0.4325480  0.15767283
## idade        -0.7032367 -0.61507339 -0.4998385  0.14146917
## mortalidade   0.3460493  0.42278951  0.1308774 -0.09301763
## txcresc       1.0000000  0.23447240  0.2818525 -0.27908375
## causasext     0.2344724  1.00000000  0.4044469 -0.04528098
## favel         0.2818525  0.40444685  1.0000000 -0.10648120
## denspop      -0.2790838 -0.04528098 -0.1064812  1.00000000

Para o caso dos gráficos de calor, é melhor que a base de dados esteja no formato long em vez do formato wide. Podemos alterar isso com a função melt() do pacote ‘reshape2’

?melt
## Help on topic 'melt' was found in the following packages:
## 
##   Package               Library
##   data.table            /home/erick/R/x86_64-pc-linux-gnu-library/4.1
##   reshape2              /home/erick/R/x86_64-pc-linux-gnu-library/4.1
## 
## 
## Using the first match ...
correlacoes <- melt(matriz_correlacoes)

head(correlacoes)
##           Var1  Var2      value
## 1        renda renda  1.0000000
## 2        quota renda  0.9200994
## 3 escolaridade renda  0.7773322
## 4        idade renda  0.7323071
## 5  mortalidade renda -0.5195850
## 6      txcresc renda -0.4247108
tail(correlacoes)
##           Var1    Var2       value
## 76       idade denspop  0.14146917
## 77 mortalidade denspop -0.09301763
## 78     txcresc denspop -0.27908375
## 79   causasext denspop -0.04528098
## 80       favel denspop -0.10648120
## 81     denspop denspop  1.00000000

Aqui, nós vamos alterar os nomes das variáveis do nosso novo objeto que demos o nome de ‘correlacoes’:

names(correlacoes) <- c("var1", "var2", "correlacao")

correlacoes
##            var1         var2  correlacao
## 1         renda        renda  1.00000000
## 2         quota        renda  0.92009937
## 3  escolaridade        renda  0.77733216
## 4         idade        renda  0.73230705
## 5   mortalidade        renda -0.51958497
## 6       txcresc        renda -0.42471079
## 7     causasext        renda -0.46251567
## 8         favel        renda -0.14695749
## 9       denspop        renda -0.01971076
## 10        renda        quota  0.92009937
## 11        quota        quota  1.00000000
## 12 escolaridade        quota  0.85045460
## 13        idade        quota  0.83273686
## 14  mortalidade        quota -0.52028200
## 15      txcresc        quota -0.55476724
## 16    causasext        quota -0.49101971
## 17        favel        quota -0.24301018
## 18      denspop        quota  0.05737442
## 19        renda escolaridade  0.77733216
## 20        quota escolaridade  0.85045460
## 21 escolaridade escolaridade  1.00000000
## 22        idade escolaridade  0.95582487
## 23  mortalidade escolaridade -0.58260085
## 24      txcresc escolaridade -0.69296759
## 25    causasext escolaridade -0.60662084
## 26        favel escolaridade -0.43254796
## 27      denspop escolaridade  0.15767283
## 28        renda        idade  0.73230705
## 29        quota        idade  0.83273686
## 30 escolaridade        idade  0.95582487
## 31        idade        idade  1.00000000
## 32  mortalidade        idade -0.55375832
## 33      txcresc        idade -0.70323674
## 34    causasext        idade -0.61507339
## 35        favel        idade -0.49983847
## 36      denspop        idade  0.14146917
## 37        renda  mortalidade -0.51958497
## 38        quota  mortalidade -0.52028200
## 39 escolaridade  mortalidade -0.58260085
## 40        idade  mortalidade -0.55375832
## 41  mortalidade  mortalidade  1.00000000
## 42      txcresc  mortalidade  0.34604928
## 43    causasext  mortalidade  0.42278951
## 44        favel  mortalidade  0.13087742
## 45      denspop  mortalidade -0.09301763
## 46        renda      txcresc -0.42471079
## 47        quota      txcresc -0.55476724
## 48 escolaridade      txcresc -0.69296759
## 49        idade      txcresc -0.70323674
## 50  mortalidade      txcresc  0.34604928
## 51      txcresc      txcresc  1.00000000
## 52    causasext      txcresc  0.23447240
## 53        favel      txcresc  0.28185252
## 54      denspop      txcresc -0.27908375
## 55        renda    causasext -0.46251567
## 56        quota    causasext -0.49101971
## 57 escolaridade    causasext -0.60662084
## 58        idade    causasext -0.61507339
## 59  mortalidade    causasext  0.42278951
## 60      txcresc    causasext  0.23447240
## 61    causasext    causasext  1.00000000
## 62        favel    causasext  0.40444685
## 63      denspop    causasext -0.04528098
## 64        renda        favel -0.14695749
## 65        quota        favel -0.24301018
## 66 escolaridade        favel -0.43254796
## 67        idade        favel -0.49983847
## 68  mortalidade        favel  0.13087742
## 69      txcresc        favel  0.28185252
## 70    causasext        favel  0.40444685
## 71        favel        favel  1.00000000
## 72      denspop        favel -0.10648120
## 73        renda      denspop -0.01971076
## 74        quota      denspop  0.05737442
## 75 escolaridade      denspop  0.15767283
## 76        idade      denspop  0.14146917
## 77  mortalidade      denspop -0.09301763
## 78      txcresc      denspop -0.27908375
## 79    causasext      denspop -0.04528098
## 80        favel      denspop -0.10648120
## 81      denspop      denspop  1.00000000

Agora sim, aplicando a sintaxe básica do ggplot2, temos:

ggplot(correlacoes) +
  geom_tile(aes(x = var1, y = var2, fill = correlacao))

Podemos remover os nomes dos eixos do gráfico da seguinte forma:

ggplot(correlacoes) +
  geom_tile(aes(x = var1, y = var2, fill = correlacao)) +
  labs(x = NULL,
       y = NULL,
       fill = "Correlações")

Podemos criar um gradiente de cores, da seguinte maneira:

ggplot(correlacoes) +
  geom_tile(aes(x = var1, y = var2, fill = correlacao)) +
  labs(x = NULL,
       y = NULL,
       fill = "Correlações") +
  scale_fill_gradient2(low = "#440154FF", 
                       mid = "white", 
                       high = "#FDE725FF",
                       midpoint = 0)

Podemos incluir os valores de cada correlação em cada quadrícula:

ggplot(correlacoes) +
  geom_tile(aes(x = var1, y = var2, fill = correlacao)) +
  geom_text(aes(x = var1, y = var2, label = correlacao), size = 2) +
  labs(x = NULL,
       y = NULL,
       fill = "Correlações") +
  scale_fill_gradient2(low = "darkblue", 
                       mid = "white", 
                       high = "darkred",
                       midpoint = 0)

Os valores das correlações estão muito extensos, certo? Basta aplicarmos um arredondamento a eles com a função round():

ggplot(correlacoes) +
  geom_tile(aes(x = var1, y = var2, fill = correlacao)) +
  geom_text(aes(x = var1, y = var2, label = round(correlacao, digits = 3)), 
            size = 3) +
  labs(x = NULL,
       y = NULL,
       fill = "Correlações") +
  scale_fill_gradient2(low = "darkblue", 
                       mid = "white", 
                       high = "darkred",
                       midpoint = 0) +
  theme_bw()

Lembra da ggplotly() do pacote ‘plotly’? Pois é! Podemos aplicá-la aqui também!

ggplotly(
  ggplot(correlacoes) +
    geom_tile(aes(x = var1, y = var2, fill = correlacao)) +
    geom_text(aes(x = var1, y = var2, 
                  label = round(correlacao, digits = 3)), 
              size = 3) +
    labs(x = NULL,
         y = NULL,
         fill = "Correlações") +
    scale_fill_gradient2(low = "darkblue", 
                         mid = "white", 
                         high = "darkred",
                         midpoint = 0) +
    theme_bw()
)

Os nomes das variáveis estão sobrepostos no eixo das abcissas. Podemos resolver isso com argumentos à função theme():

ggplot(correlacoes) +
    geom_tile(aes(x = var1, y = var2, fill = correlacao)) +
    geom_text(aes(x = var1, y = var2, label = round(correlacao, 
                                                    digits = 3)), 
              size = 3) +
    labs(x = NULL,
         y = NULL,
         fill = "Correlações") +
    scale_fill_gradient2(low = "darkblue", 
                         mid = "white", 
                         high = "darkred",
                         midpoint = 0) +
    theme(panel.background = element_rect("white"),
        panel.grid = element_line("grey95"),
        panel.border = element_rect(NA),
        legend.position = "bottom",
        axis.text.x = element_text(angle = 90))

Boxplot

No R, para construir alguns boxplots, é melhor que utilizemos nossas bases de dados no formato long. Basta utilizarmos a função melt() do pacote ‘reshape2’:

atlas_long <- melt(atlas_ambiental[, 2:11], id.vars = "distritos")

head(atlas_long)
##           distritos variable value
## 1         Água Rasa    renda  1961
## 2 Alto de Pinheiros    renda  4180
## 3        Anhanguera    renda  1093
## 4        Aricanduva    renda  1311
## 5       Artur Alvim    renda  1248
## 6       Barra Funda    renda  2359
tail(atlas_long)
##         distritos variable  value
## 859  Vila Matilde  denspop 111.70
## 860 Vila Medeiros  denspop 188.93
## 861 Vila Prudente  denspop 101.44
## 862    Vila Sônia  denspop  80.12
## 863  São Domingos  denspop  72.92
## 864       Lajeado  denspop 141.01

Agora sim, podemos plotar nossos dados:

ggplot(atlas_long) +
  geom_boxplot(aes(x = variable, y = value, fill = variable))

A visualização ficou diferente do esperado, não é? Você consegue dizer a razão disso?

O problema está na comparação de variáveis com tipos distintos de magnitude.

Podemos resolver a situação padronizando as variáveis com o procedimento zscores, por exemplo:

\(zX_{i}=\frac{X_{i}-\bar{X}}{\sigma}\)

atlas_padronizado <- atlas_ambiental

atlas_padronizado[, 3:11] <- scale(atlas_padronizado[, 3:11])

head(atlas_padronizado)
## # A tibble: 6 × 11
##   cód_ibge distritos       renda  quota escolaridade   idade mortalidade txcresc
##   <chr>    <chr>           <dbl>  <dbl>        <dbl>   <dbl>       <dbl>   <dbl>
## 1 1        Água Rasa       0.108  0.180       0.520   1.05        -0.427  -0.536
## 2 2        Alto de Pinhe…  2.39   1.97        1.31    1.28        -1.46   -0.730
## 3 3        Anhanguera     -0.786 -1.13       -1.26   -1.00        -0.127   5.15 
## 4 4        Aricanduva     -0.562 -0.411      -0.273  -0.0903       0.488  -0.317
## 5 5        Artur Alvim    -0.627 -0.632      -0.0743 -0.0903       0.748  -0.411
## 6 6        Barra Funda     0.518  0.166       0.917   0.822       -1.48   -0.621
## # … with 3 more variables: causasext <dbl>, favel <dbl>, denspop <dbl>
tail(atlas_padronizado)
## # A tibble: 6 × 11
##   cód_ibge distritos      renda   quota escolaridade   idade mortalidade txcresc
##   <chr>    <chr>          <dbl>   <dbl>        <dbl>   <dbl>       <dbl>   <dbl>
## 1 91       Vila Matilde  -0.336 -0.194         0.322  0.366        0.628  -0.533
## 2 92       Vila Medeiros -0.465 -0.465        -0.273 -0.0903      -0.113  -0.413
## 3 93       Vila Prudente -0.104  0.0695        0.124  0.594       -0.327  -0.738
## 4 94       Vila Sônia     1.15   0.474         0.322 -0.0903       0.154  -0.268
## 5 95       São Domingos   0.197 -0.302        -0.273 -0.318       -0.339   0.191
## 6 96       Lajeado       -1.11  -0.954        -1.66  -1.46         0.532   0.795
## # … with 3 more variables: causasext <dbl>, favel <dbl>, denspop <dbl>

Como já visto, devemos transformar nossa base de dados em formato long:

atlas_padronizado_long <- melt(atlas_padronizado[, 2:11],
                               id.vars = "distritos")

head(atlas_padronizado_long)
##           distritos variable      value
## 1         Água Rasa    renda  0.1079357
## 2 Alto de Pinheiros    renda  2.3937396
## 3        Anhanguera    renda -0.7861958
## 4        Aricanduva    renda -0.5616328
## 5       Artur Alvim    renda -0.6265294
## 6       Barra Funda    renda  0.5179177
tail(atlas_padronizado_long)
##         distritos variable       value
## 859  Vila Matilde  denspop  0.23867472
## 860 Vila Medeiros  denspop  1.79551721
## 861 Vila Prudente  denspop  0.03184841
## 862    Vila Sônia  denspop -0.39793125
## 863  São Domingos  denspop -0.54307270
## 864       Lajeado  denspop  0.82952092

Vamos tentar, mais uma vez, utilizar a sintaxe básica do ggplot2 para a construção de boxplots:

ggplot(atlas_padronizado_long) +
  geom_boxplot(aes(x = variable, y = value, fill = variable))

Podemos deixar o gráfico mais elegante nomeando os eixos, alterando o plano de fundo e removendo a legenda:

ggplot(atlas_padronizado_long) +
  geom_boxplot(aes(x = variable, y = value, fill = variable)) +
  labs(x = "Variáveis",
       y = "Valores") +
  theme(panel.background = element_rect("white"),
        panel.grid = element_line("grey95"),
        panel.border = element_rect(NA),
        legend.position = "none",
        axis.text.x = element_text(angle = 90))

Com objetivos puramente didáticos, podemos visualizar cada observação de cada variável padronizada da seguinte maneira:

ggplot(atlas_padronizado_long) +
  geom_boxplot(aes(x = variable, y = value, fill = variable)) +
  geom_point(aes(x = variable, y = value), alpha = 0.1) +
  labs(x = "Variáveis",
       y = "Valores") +
  theme(panel.background = element_rect("white"),
        panel.grid = element_line("grey95"),
        panel.border = element_rect(NA),
        legend.position = "none",
        axis.text.x = element_text(angle = 90))

E sim! Podemos deixas nossos boxplots interativos com ajuda do pacote ‘plotly’

ggplotly(
  ggplot(atlas_padronizado_long) +
    geom_boxplot(aes(x = variable, y = value, fill = variable)) +
    labs(x = "Variáveis",
         y = "Valores") +
    theme_bw()
)